/**
 * @file historialPacienteDetallado.java
 * 
 *
 * Copyright (C)  - May [2011]
 *
 * 
 * @version 01.00
 *
 */

package interfaces;

import GestorUsuarios.IDException;



import Controlador.*;
import GestorCitas.*;
import GestorFarmacia.Medicamento;
import GestorPruebas.*;
import GestorUsuarios.Paciente;
import GestorUsuarios.Usuario;

import paciente.Interfaces;
import paciente.Interfaz;
import java.awt.Component;
import java.awt.event.*;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import org.jdesktop.application.Action;
import java.util.Date;
import javax.swing.ImageIcon;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableCellRenderer;
import paciente.PacienteView;


public class historialPacienteDetallado extends javax.swing.JPanel{

    public class MyRenderer extends DefaultTableCellRenderer {
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value,
                                                     boolean isSelected, boolean hasFocus,
                                                     int row, int column) {
            ImageIcon icon = null;
            if(value.equals("Si")) {
                icon = new ImageIcon(getClass().getResource("/interfaces/resources/Box-green-32.png"));
            } else if(value.equals("No"))
                icon = new ImageIcon(getClass().getResource("/interfaces/resources/Box-red-32.png"));

            setIcon(icon);
            setHorizontalAlignment(CENTER);
            return this;
      }
    }
    
    private TableModel _modelo;
    private PacienteView _app;
    private Cita _cita;
    private Prueba  _prueba[] = null ;
    private LineaReceta _recetas[] = null;
    Interfaces _anterior;

    /** Creates new customizer NewCustomizer */
    public historialPacienteDetallado(PacienteView a) {
        _app = a;
        initComponents();

        //tabla citas
        String[] columnNames = {"Tipo prueba","Fecha","Fecha Resultados","Resultados","Habilitado"};
        _modelo = new DefaultTableModel(null, columnNames);
        tabla_pruebas.setModel(_modelo);
        tabla_pruebas.getColumn("Resultados").setCellRenderer(new MyRenderer());
        tabla_pruebas.setRowHeight(32);
        tabla_pruebas.getColumn("Resultados").setWidth(70);
        tabla_pruebas.getColumn("Resultados").setMinWidth(70);
        tabla_pruebas.getColumn("Resultados").setMaxWidth(70);

        tabla_pruebas.getColumn("Habilitado").setCellRenderer(new MyRenderer());
        tabla_pruebas.getColumn("Habilitado").setWidth(70);
        tabla_pruebas.getColumn("Habilitado").setMinWidth(70);
        tabla_pruebas.getColumn("Habilitado").setMaxWidth(70);

        tabla_pruebas.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        tabla_citas.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

   
        tabla_pruebas.setRowHeight(32);
        tabla_citas.setRowHeight(32);

        
        //Cargamos eventos para cambio de tab
        jTabbedPane1.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                cambioTab(evt);
            }
        });

        /* Cargamos los eventos para el ratón pruebas
        tabla_pruebas.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                eventoPruebas();
            }
        });*/

        resultados.setVisible(false);
        resultados.setEnabled(false);
       
     
    }



    public void rellenaDatos(Cita c,Interfaces ant) throws GestorUsuarios.IDException, SQLException, IOException, ClassNotFoundException, SQLException, NoSuchAlgorithmException, ParseException {
        DateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy HH:mm");
        _anterior = ant;
        Usuario user =null;

        // Limpiamos las tablas
        resultados.setEnabled(false);
        
        Interfaz.limpiarTabla(tabla_pruebas);
        Interfaz.limpiarTabla(tabla_citas);
        
        if ( cita != null )
        {
            //Asignamos valores de la cita
            _cita = c;

            observaciones.setText(_cita.getObservaciones());

            Usuario m = Usuario.get(_cita.getIdMedico());

            String estadoCita;
            if ( _cita.getEstado() == EstadoCita.CANCELADA ) {
                estadoCita = "Cancelada";
            }
            else if ( _cita.getEstado() == EstadoCita.FINALIZADA ) {
                estadoCita = "Finalizada";
            }
            else if ( _cita.getEstado() == EstadoCita.PENDIENTE ) {
                estadoCita = "Pendiente";
            }
            else {
                estadoCita = "No llevada a cabo";
            }
        
            String [] valores = {m.getNombre() + " " + m.getApellidos(), formatoFecha.format(_cita.getFechaCita()),
            estadoCita};
            ((DefaultTableModel)tabla_citas.getModel()).addRow(valores);

            //Rellenamos los datos de las pruebas medicas
            rellenaPruebas();

            //Rellenamos los datos de las recetas
            rellenaRecetas();

        }
    }

    void rellenaPruebas() throws SQLException, IOException, ClassNotFoundException, NoSuchAlgorithmException, IDException, ParseException{
        // Obtenemos todas las pruebas (historial) de la cita en cuestion
        _prueba = Controlador.consultarPruebas(_cita.getIdCita(), null, null, null, null, null,null);
        if (_prueba != null) {
        //Nos quedamos todas menos las no_realizadas o las canceladas
        ArrayList<Prueba> correctas = new ArrayList<Prueba>();
        for ( Prueba p: _prueba ) {
            if ( p.getEstadoPrueba() != EstadoPrueba.Cancelada )
                   correctas.add(p);
        }

        _prueba = new Prueba[correctas.size()];
        _prueba = correctas.toArray(_prueba);

        //Rellenamos la tabla
        DateFormat formatoFecha = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        String[] columnNames = {"Tipo prueba","Fecha","Fecha Resultados","Resultados","Habilitado"};
        Object[][] data = new Object[_prueba.length][];
        for(int i=0;i<_prueba.length;i++) {
                    String tipo ;
                    if (_prueba[i].getTipo() == TipoPrueba.BioquimicaGeneral)
                        tipo = "Bioquimía general";
                    else if (_prueba[i].getTipo() == TipoPrueba.HematologiaGeneral)
                        tipo = "Hematología general";
                    else if (_prueba[i].getTipo() == TipoPrueba.Hemostasia)
                        tipo = "Hemostasia";
                    else if (_prueba[i].getTipo() == TipoPrueba.Hormonas)
                        tipo = "Hormonas";
                    else if (_prueba[i].getTipo() == TipoPrueba.MarcadoresTumorales)
                        tipo = "Marcadores tumorales";
                    else if (_prueba[i].getTipo() == TipoPrueba.Radiografia)
                        tipo = "Radiografía";
                    else
                        tipo = "Análisis de orina";

                    String fechaRes;
                    if ( _prueba[i].getEstadoPrueba() == EstadoPrueba.No_realizada )
                        fechaRes = "Cancelada";
                    if ( _prueba[i].getFechaResultados() != null )
                        fechaRes = formatoFecha.format(_prueba[i].getFechaResultados());
                    else
                        fechaRes = "";

                    String res;
                    if ( _prueba[i].getEstadoPrueba() == EstadoPrueba.Realizada || _prueba[i].getEstadoPrueba() == EstadoPrueba.Visualizable )
                        res = "Si";
                    else
                        res = "No";

                    String habilitado;
                    if ( _prueba[i].getEstadoPrueba() == EstadoPrueba.Visualizable )
                        habilitado = "Si";
                    else
                        habilitado = "No";
                    
                    data[i] = new Object[5];
                    data[i][0] = tipo ;
                    data[i][1] = formatoFecha.format(_prueba[i].getFechaResultados());
                    data[i][2] = fechaRes;
                    data[i][3] = res;
                    data[i][4] = habilitado;

        }

        _modelo = new DefaultTableModel(data, columnNames) {
            @Override
            public boolean isCellEditable(int row, int col) {
                return false;
            }
        };

        tabla_pruebas.setModel(_modelo);
        tabla_pruebas.getColumn("Resultados").setCellRenderer(new MyRenderer());
        tabla_pruebas.setRowHeight(32);
        tabla_pruebas.getColumn("Resultados").setWidth(70);
        tabla_pruebas.getColumn("Resultados").setMinWidth(70);
        tabla_pruebas.getColumn("Resultados").setMaxWidth(70);

        tabla_pruebas.getColumn("Habilitado").setCellRenderer(new MyRenderer());
        tabla_pruebas.getColumn("Habilitado").setWidth(70);
        tabla_pruebas.getColumn("Habilitado").setMinWidth(70);
        tabla_pruebas.getColumn("Habilitado").setMaxWidth(70);

        tabla_pruebas.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        }
    }

    void rellenaRecetas() throws SQLException, IOException, ClassNotFoundException{
        DateFormat fecha = new SimpleDateFormat("dd/MM/yyyy");

        Receta receta[] = Receta.get(null, null, _cita.getIdCita());
        if (receta != null ) {
            _recetas = receta[0].getLineasReceta();
            /* Colocamos en la tabla*/
            if (_recetas != null)
            for(LineaReceta l:_recetas) {
                String estado = "Activa";
                if(l.getEstaCancelada()) estado = "Cancelada";
                String [] valores = {""+Medicamento.get(l.getIdMedicamento()).getNombreMedicamento(),
                                 "Cada "+l.getCada()+" "+l.getTiempoCada(),""+fecha.format(l.getFechaInicio()),""+l.getNumTomas(),""+estado};
                
            }
       }

    }


    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jTabbedPane1 = new javax.swing.JTabbedPane();
        panel_citas = new javax.swing.JPanel();
        cita = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        tabla_citas = new javax.swing.JTable();
        observaciones = new javax.swing.JTextField();
        jLabel1 = new javax.swing.JLabel();
        panel_pruebas = new javax.swing.JPanel();
        jScrollPane2 = new javax.swing.JScrollPane();
        tabla_pruebas = new javax.swing.JTable();
        jButton3 = new javax.swing.JButton();
        resultados = new javax.swing.JButton();

        setMaximumSize(new java.awt.Dimension(780, 470));
        setMinimumSize(new java.awt.Dimension(780, 470));
        setPreferredSize(new java.awt.Dimension(780, 472));

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Historial Detallado", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, Interfaz.setFontSize()));
        jPanel1.setMaximumSize(new java.awt.Dimension(780, 470));
        jPanel1.setName("jPanel1"); // NOI18N

        jTabbedPane1.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
        jTabbedPane1.setFont(new java.awt.Font("Lucida Grande", 0, 14)); // NOI18N
        jTabbedPane1.setName("algo"); // NOI18N

        panel_citas.setName("panel_citas"); // NOI18N

        cita.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Detalles Cita", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, Interfaz.setFontSize()));
        cita.setName("cita"); // NOI18N

        jScrollPane1.setName("jScrollPane1"); // NOI18N

        tabla_citas.setFont(Interfaz.setFontSize());
        tabla_citas.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null}
            },
            new String [] {
                "Médico", "Fecha", "Estado"
            }
        ));
        tabla_citas.setEnabled(false);
        tabla_citas.setName("tabla_citas"); // NOI18N
        jScrollPane1.setViewportView(tabla_citas);

        org.jdesktop.layout.GroupLayout citaLayout = new org.jdesktop.layout.GroupLayout(cita);
        cita.setLayout(citaLayout);
        citaLayout.setHorizontalGroup(
            citaLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(citaLayout.createSequentialGroup()
                .addContainerGap()
                .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 671, Short.MAX_VALUE)
                .addContainerGap())
        );
        citaLayout.setVerticalGroup(
            citaLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(citaLayout.createSequentialGroup()
                .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 64, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        observaciones.setEditable(false);
        observaciones.setFont(Interfaz.setFontSize());
        observaciones.setName("observaciones"); // NOI18N

        jLabel1.setFont(Interfaz.setFontSize());
        jLabel1.setText("Observaciones de la cita:");
        jLabel1.setName("jLabel1"); // NOI18N

        org.jdesktop.layout.GroupLayout panel_citasLayout = new org.jdesktop.layout.GroupLayout(panel_citas);
        panel_citas.setLayout(panel_citasLayout);
        panel_citasLayout.setHorizontalGroup(
            panel_citasLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, panel_citasLayout.createSequentialGroup()
                .addContainerGap()
                .add(panel_citasLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                    .add(org.jdesktop.layout.GroupLayout.LEADING, cita, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .add(org.jdesktop.layout.GroupLayout.LEADING, observaciones, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 703, Short.MAX_VALUE)
                    .add(org.jdesktop.layout.GroupLayout.LEADING, jLabel1))
                .addContainerGap())
        );
        panel_citasLayout.setVerticalGroup(
            panel_citasLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(panel_citasLayout.createSequentialGroup()
                .add(cita, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(20, 20, 20)
                .add(jLabel1)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(observaciones, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 128, Short.MAX_VALUE)
                .addContainerGap())
        );

        jTabbedPane1.addTab("Datos de la cita", panel_citas);

        panel_pruebas.setName("panel_pruebas"); // NOI18N

        jScrollPane2.setName("jScrollPane2"); // NOI18N

        tabla_pruebas.setFont(Interfaz.setFontSize());
        tabla_pruebas.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null}
            },
            new String [] {
                "Tipo prueba", "Fecha cita", "Fecha resultados", "Resultados", "Habilitado"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false, false, false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        tabla_pruebas.setName("tabla_pruebas"); // NOI18N
        tabla_pruebas.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        tabla_pruebas.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                tabla_pruebasMouseClicked(evt);
            }
        });
        jScrollPane2.setViewportView(tabla_pruebas);

        org.jdesktop.layout.GroupLayout panel_pruebasLayout = new org.jdesktop.layout.GroupLayout(panel_pruebas);
        panel_pruebas.setLayout(panel_pruebasLayout);
        panel_pruebasLayout.setHorizontalGroup(
            panel_pruebasLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, panel_pruebasLayout.createSequentialGroup()
                .addContainerGap()
                .add(jScrollPane2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 703, Short.MAX_VALUE)
                .addContainerGap())
        );
        panel_pruebasLayout.setVerticalGroup(
            panel_pruebasLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(panel_pruebasLayout.createSequentialGroup()
                .addContainerGap()
                .add(jScrollPane2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 259, Short.MAX_VALUE)
                .addContainerGap())
        );

        jTabbedPane1.addTab("Pruebas detalladas", panel_pruebas);

        org.jdesktop.layout.GroupLayout jPanel1Layout = new org.jdesktop.layout.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .add(jTabbedPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 728, Short.MAX_VALUE)
                .addContainerGap())
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanel1Layout.createSequentialGroup()
                .add(jTabbedPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 314, Short.MAX_VALUE)
                .addContainerGap(12, Short.MAX_VALUE))
        );

        jTabbedPane1.getAccessibleContext().setAccessibleName("Datos de la cita"); // NOI18N

        javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(paciente.PacienteApp.class).getContext().getActionMap(historialPacienteDetallado.class, this);
        jButton3.setAction(actionMap.get("aceptar")); // NOI18N
        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(paciente.PacienteApp.class).getContext().getResourceMap(historialPacienteDetallado.class);
        jButton3.setIcon(resourceMap.getIcon("jButton3.icon")); // NOI18N
        jButton3.setLabel(resourceMap.getString("jButton3.label")); // NOI18N
        jButton3.setName("jButton3"); // NOI18N

        resultados.setAction(actionMap.get("verResultados")); // NOI18N
        resultados.setIcon(resourceMap.getIcon("resultados.icon")); // NOI18N
        resultados.setName("resultados"); // NOI18N

        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
                        .add(resultados)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 577, Short.MAX_VALUE)
                        .add(jButton3, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 86, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                    .add(org.jdesktop.layout.GroupLayout.TRAILING, jPanel1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .addContainerGap()
                .add(jPanel1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(layout.createSequentialGroup()
                        .add(24, 24, 24)
                        .add(jButton3))
                    .add(layout.createSequentialGroup()
                        .add(18, 18, 18)
                        .add(resultados)))
                .addContainerGap())
        );
    }// </editor-fold>//GEN-END:initComponents

    private void tabla_pruebasMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tabla_pruebasMouseClicked
        // TODO add your handling code here:
        eventoPruebas();
    }//GEN-LAST:event_tabla_pruebasMouseClicked

    @Action
    void eventoPruebas () {
        int row = tabla_pruebas.getSelectedRow();
        resultados.setEnabled(false);
        if ( row >= 0) {
            if (_prueba[row].getEstadoPrueba() == EstadoPrueba.Visualizable)
                    resultados.setEnabled(true);
            else
                resultados.setEnabled(false);
        }
    }
  
    @Action
    public void cambioTab(javax.swing.event.ChangeEvent evt){
    // esto registrara un evento cada que el usuario seleccione un tab
        if(jTabbedPane1.getSelectedIndex() == 1){
            resultados.setVisible(true);
            resultados.setEnabled(false);
        }
        else {
            resultados.setVisible(false);
            resultados.setEnabled(false);

        }

    }
   
  
    @Action
    public void aceptar() throws NoSuchAlgorithmException, IOException, ClassNotFoundException, SQLException {
        _app.volver(_anterior);
    }

    @Action
    public void verResultados() throws SQLException, IOException, ClassNotFoundException, NoSuchAlgorithmException, ParseException, IDException {
        int row = tabla_pruebas.getSelectedRow();

        if ( row >= 0 ) {
            _app.abrirVerResultados(_prueba[row], Interfaces.HISTORIAL_PACIENTE_DETALLADO);
        }

    }




    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JPanel cita;
    private javax.swing.JButton jButton3;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JTabbedPane jTabbedPane1;
    private javax.swing.JTextField observaciones;
    private javax.swing.JPanel panel_citas;
    private javax.swing.JPanel panel_pruebas;
    private javax.swing.JButton resultados;
    private javax.swing.JTable tabla_citas;
    private javax.swing.JTable tabla_pruebas;
    // End of variables declaration//GEN-END:variables


}
